package com.example.design_pattern.singleton;

// 这是最基本的实现方式，第一次调用才初始化，实现了懒加载的特性。多线程场景下禁止使用，因为可能会产生多个对象，不再是单例。

// 为什么懒汉式单例，如果不加同步锁的话，那么在多线程场景下，会线程不安全？
// 在懒汉式单例模式中，如果不加同步锁，在多线程环境下可能会发生以下情况：
//1. 当多个线程同时调用getInstance()方法时，如果实例尚未创建，它们都会通过判断实例是否为null来进入实例化的代码块。
//2. 在第一个线程进入实例化代码块但还未完成实例化之前，第二个线程也通过了实例为null的判断，也进入了实例化代码块。
//3. 这样就会导致多个线程同时执行实例化代码块，创建了多个实例，违反了单例模式的原则。
//因此，为了保证懒汉式单例在多线程环境下的线程安全性，需要在getInstance()方法上添加同步锁，确保在多线程情况下只有一个线程可以进入实例化代码块，避免同时创建多个实例。

// 以上就是典型的多线程场景下线程不安全的发生原因。因为，instance是公共资源，而多线程对于公共资源instance的使用、操作，有多处，这一套流程在底层不是天然是原子性的。
// 只有我们自己在代码层面给它加上同步锁，保证这套操作的原子性，那么，才是线程安全的。
public class Singleton03Lazy {

    private static Singleton03Lazy instance;

    private Singleton03Lazy() {}

    public static Singleton03Lazy getInstance() {
        if (instance == null) {
            instance = new Singleton03Lazy();
        }
        return instance;
    }

}
